/**

 * 版权所有(C)，上海勾芒信息科技，2017，所有权利保留。
 *
 * 项目名：cards-web 
 * 文件名：:ChinaPayUtil.java
 * 模块说明：	
 * 修改历史：
 * 2017年11月10日 - liyang - 创建。
 *
 */
package com.thor.palmmall.util.pay;

import java.util.Map;
import java.util.Properties;

import com.chinapay.secss.SecssUtil;
import com.thor.palmmall.api.statement.AStatementPayBill;
import com.thor.palmmall.rest.user.AChannelContents;

/**
 * @author:liyang
 * @time:2017年11月10日 下午3:09:17
 * @since:1.0
 */
public class ChinaPayUtil {

  /**
   * 初始化安全控件
   * 
   * @param channel
   *          商户账户信息
   * @return
   */
  public static SecssUtil initSecssUtil(AChannelContents channel) {

    SecssUtil secssUtil = new SecssUtil();
    Properties p = new Properties();
    p.setProperty("verify.file", channel.getRootCertPath());
    p.setProperty("sign.file", channel.getSignCertPath());
    p.setProperty("sign.file.password", channel.getSignCertPwd());
    p.setProperty("sign.cert.type", channel.getSignCertType());
    p.setProperty("sign.invalid.fields", "Signature,CertId");
    p.setProperty("signature.field", "Signature");
    secssUtil.init(p);
    return secssUtil;
  };

  /**
   * 生成签名
   * 
   * @param signMap
   *          签名字段集
   * @return
   */
  public static String sign(Map signMap) {
    SecssUtil  secssUtil = new SecssUtil();
    secssUtil.init();
    secssUtil.sign(signMap);
    System.out.println(secssUtil.getErrCode());
    System.out.println(secssUtil.getErrMsg());
    return secssUtil.getSign();
  }

  /**
   * 验证签名信息
   * 
   * @param secssUtil
   *          安全控件工具类
   * @param map
   *          签名字段集
   * @return
   */
  public static boolean verify(AStatementPayBill bill,Map map) {
    SecssUtil secssUtil = new SecssUtil();
    Properties p = new Properties();
    p.setProperty("verify.file", bill.getVerifyFilePath());
    p.setProperty("sign.file", bill.getSignFilePath());
    p.setProperty("sign.file.password", bill.getSignFilePwd());
    p.setProperty("sign.cert.type", bill.getSignCertType());
    p.setProperty("sign.invalid.fields", "Signature,CertId");
    p.setProperty("signature.field", "Signature");
    secssUtil.init(p);
    secssUtil.verify(map);
    String msg = secssUtil.getErrMsg();
    if ("00".equals(secssUtil.getErrCode()))
      return true;
    return false;
  }

  /**
   * 解密敏感数据
   * 
   * @param secssUtil
   *          安全控件工具类
   * @param encData
   *          加密明文
   * @return
   */
  public static String decryptData(SecssUtil secssUtil, String encData) {
    secssUtil.decryptData(encData);
    return secssUtil.getSign();
  }

  public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
    if (map == null)
      return null;

    Object obj = beanClass.newInstance();

    org.apache.commons.beanutils.BeanUtils.populate(obj, map);

    return obj;
  }

  public static Map<?, ?> objectToMap(Object obj) {
    if (obj == null)
      return null;

    return new org.apache.commons.beanutils.BeanMap(obj);
  }

}
